/**
 * 应用程序入口文件
 * @module app
 */

// 首先加载环境变量
const path = require('path');
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });

// 添加调试信息
console.log('环境变量调试:');
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('DB_FORCE:', process.env.DB_FORCE);
console.log('JWT_SECRET:', process.env.JWT_SECRET ? '已设置' : '未设置');

const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const helmet = require('helmet');
const { testConnection, sequelize } = require('./config/database');
const { initDatabase } = require('./models');
const routes = require('./routes');

// 创建Express应用
const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(helmet()); // 安全头
app.use(cors()); // 跨域支持
app.use(morgan(process.env.NODE_ENV === 'development' ? 'dev' : 'combined')); // 日志
app.use(express.json()); // JSON解析
app.use(express.urlencoded({ extended: true })); // URL编码解析

// 静态文件服务
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));

// API路由
app.use('/api', routes);

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error('全局错误处理:', err);
  res.status(500).json({ message: '服务器错误' });
});

// 启动服务器
const startServer = async () => {
  try {
    // 测试数据库连接
    await testConnection();
    
    // 初始化数据库 (开发环境可以设置force为true重建表)
    const force = process.env.NODE_ENV === 'development' && process.env.DB_FORCE === 'true';
    console.log('数据库初始化参数:', { 
      NODE_ENV: process.env.NODE_ENV, 
      DB_FORCE: process.env.DB_FORCE, 
      force: force 
    });
    await initDatabase(force);
    
    // 启动服务器
    app.listen(PORT, () => {
      console.log(`服务器运行在 http://localhost:${PORT}`);
      console.log(`环境: ${process.env.NODE_ENV}`);
    });
  } catch (error) {
    console.error('启动服务器失败:', error);
    process.exit(1);
  }
};

// 启动应用
startServer();

// 处理未捕获的异常
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
});

// 处理未处理的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
});

module.exports = app; 